var net = require('net');
var url = require('url');
//var program = require('commander');
var http = require('http');
var util = require('util');
// var test_server = require('./test_server_8054.js');
/* 
 接收消息时：转义还原——>验证校验码——>解析消息。 
 函数以r_开头
 0x7e 0x30 7d 0x02 0x08 0x7d 0x01 0x55 0x7e
*/
const sign = Buffer.alloc(1,[0x7e]);//标识位 126
var escape1 = 125;//7d
var escape2 = 126;//7e
/*
 根据转义规则，转义接收到的消息
 返回真正的消息数据包
*/
function r_escape_message(buf, buf_datasize,ret){
   console.log('r_escape_message', buf, buf_datasize, ret);
   // var buf = 
   for (var key in ret.pos) {
       var pos_obj = ret.pos[key];
       var bufsize = pos_obj.end - pos_obj.start - 1;
       var mes_body = Buffer.allocUnsafe(bufsize);
       // buf.copy(mes_body, 0, pos_obj.start+1, pos_obj.end);
       // console.log(buf.readUInt8(pos_obj.start));
       var flag = 0;
       // buffer.slice([start], [end])
       var j = 0;
       for (var i = pos_obj.start+1; i <  pos_obj.end; i++) {
           var byte = buf.readUInt8(i);
           // console.log(byte);
           if (i == pos_obj.end -1) {
             mes_body.writeInt8(byte, j);
             j++; 
             continue;
           }
           var next = buf.readUInt8(i+1);
           if (byte == escape1) {
             if (next == 1) {
                flag = 1;
                i++;
             }else if (next == 2) {
                flag = 2;
                i++;
             }             
           }else{
            flag = 0;
           }
           if (flag == 0) {
             mes_body.writeInt8(byte, j);
           }else if (flag == 1) {
             mes_body.writeInt8(escape1, j);
           }else if (flag == 2){
             mes_body.writeInt8(escape2, j);
           }          
           j++;           
       }
       // console.log(mes_body);  
       // 将转义好的消息扔给处理消息的函数
       r_handle_messagetype(mes_body, j); 
   }
   
}
/*
  消息处理函数:消息头 消息体 检验码 
*/
function r_handle_messagetype(buf,buf_datasize){
   console.log('r_handle_message',buf,buf_datasize);
   // 读取消息id，判断消息的类型 2个字节
   var id = buf.readUInt16BE(0);
   console.log(id);
}
/*
 计算完整消息的个数和位置
 buf:数据流
 buf_datasize:缓存中数据的长度
 返回计算的消息数量和位置
*/
function r_countpos_message(buf,buf_datasize){
    // console.log(buf, buf_datasize);
    var count = 0;
    var offset = 0;
    var mes_end = 0;
    var ret = {
        pos:{}
    };
    while(offset < buf_datasize){
        var start = buf.indexOf(sign,offset);
        if (start == -1) {
            offset = buf_datasize;
        }else{
            var end = buf.indexOf(sign,start+1);
            if (end != -1) {
               count++;
               ret.pos[count] = {
                 start:start,
                 end:end
               }
               offset = end;
               mes_end = end;
            }else{
               offset = buf_datasize;
            }
        }
    }
    ret.count = count;
    ret.mes_end = mes_end;
    // console.log(ret);
    return ret;
}
// const buf = Buffer.allocUnsafe(15);
// buf.writeInt32BE(0x7e073d02, 0);
// buf.writeInt32BE(0x087d0155, 4);
// buf.writeInt32BE(0x7e222134, 8);
// r_countpos_message(buf,12);
function receive_data(data, buf, bufsize, buf_datasize){
    // 接收消息
    console.log('receive data',data);
    // 通过数据的长度计算需要几个512大小的buf存储
    var flag =  Math.ceil(data.length / bufsize);
    //把数据拷贝到buf之后
    data.copy(buf, buf_datasize, 0, data.length);
    buf_datasize += data.length;
    // console.log('1111',buf);
    // 计算每一个完整消息位置
    var ret = r_countpos_message(buf,buf_datasize);
    if (ret.count > 0) {
        // 使用消息的转义函数
        var new_buf = Buffer.allocUnsafe(ret.mes_end+1);
        buf.copy(new_buf, 0, 0, ret.mes_end+1);
        r_escape_message(new_buf, ret.mes_end+1, ret);   
        // 更新缓存buf
        var buf2 = Buffer.allocUnsafe(bufsize);
        var start = ret.mes_end+1;
        var end = buf_datasize - start;
        buf.copy(buf2, 0, start);
        buf = buf2;
        buf_datasize = end;
        // console.log('buf',buf,buf_datasize);           
    }
}
// 创建buf
var bufsize = 512;
//缓存中的数据长度
var buf_datasize = 0;
var buf = Buffer.allocUnsafe(bufsize);
// 模拟接收的data
var data =  Buffer.allocUnsafe(12);
data.writeInt32BE(0x7e307d02, 0);
data.writeInt32BE(0x087d0155, 4);
data.writeInt32BE(0x7e222134, 8);
receive_data(data, buf, bufsize, buf_datasize);
var buf2 = Buffer.allocUnsafe(bufsize);
buf2.writeInt16BE(0x2122, 0);
buf2.writeInt8(0x34, 0);
// receive_data(data, buf2, bufsize, 3)
/*
 发送消息时：消息封装——>计算并填充校验码——>转义。
 函数以s_开头
 0x30 0x7e 0x08 0x7d 0x55
*/
function s_escape_message(buf){
   
}
// function ProcessTcpServer(protocol, protocol_sc, port, callback) {
//     var server = net.createServer();
//     //接受新的客户端连接  
//     server.on('connection', function (socket) {
//         var port = socket.remotePort;
//         var addr = socket.remoteAddress;
//         console.log('CONNECTED: ' + socket.remoteAddress + ':' + socket.remotePort);
//         // 创建buf
//         var bufsize = 512;
//         //缓存中的数据长度
//         var buf_datasize = 0;
//         var buf = Buffer.allocUnsafe(bufsize);
//         socket.on('data', function (data) {            
//             // if (flag > 1) {               
//             //     for (var i = 1; i < flag; i++) {
//             //         var buf1 = Buffer.allocUnsafe(bufsize); 
//             //         var source_start = 512*i;
//             //         var source_end = 512*(i+1);
//             //         if (source_end > data.length) {
//             //            source_end = data.length;
//             //         }
//             //         data.copy(buf1, 0, source_start, source_end);
//             //     }
//             // }        
//         });
//         //删除被关闭的连接  
//         socket.on('close', function () {
//             console.log('connection closed');
//         });
//         socket.on('error', function (err) {
//             // console.log("err");
//         });
//     });

//     server.on('close', function () {
//         console.log('Server closed');
//     });
//     if (port == null)
//         port = 8051; //出错处理,启动默认端口
//     server.listen(port);
//     console.log('listening on *:'+ port+' car tcpserver');
// }
// exports.ProcessTcpServer = ProcessTcpServer;